BOJ_2467_용액
투 포인터(Two-Pointers)를 활용해서 0에 가장 가까운 합을 찾는 문제
부호에 관계 없이0에 가까운 합을 찾는 것이므로 절댓값을 활용했다
양 끝에서 포인터를 중앙으로 옮겨가면서 최솟값을 갱신한다
이렇게 풀었을 때 시간복잡도는 O(N)이다
번외로, 이분 탐색(Binary Search)으로 이 문제를 해결할 수 있다
인덱스를 0부터 N-1까지 늘려가며,
이분탐색으로 해당 인덱스의 값 + 탐색값이 가장 0에 가까운 것을 찾아 갱신한다
다만 이 방식으로 풀면 시간복잡도가 O(NlogN)이 되기 때문에 더 비효율적ㅇ
import sys
input = sys.stdin.readline
N = int(input())
solution = list(map(int, input().split()))
start = 0
end = N - 1
min_value = 2000000001
val = (0, 0)
while start < end:
now_val = abs(solution[start] + solution[end])
if now_val < min_value:
min_value = now_val
val = (solution[start], solution[end])
if solution[start] + solution[end] > 0:
end -= 1
elif solution[start] + solution[end] < 0:
start += 1
else:
break
print(val[0], val[1])